﻿using System;
using System.Collections.Generic;
using System.Text;

namespace NielsRask.K242.Core.AI
{
	public class Emperor 
	{
		public Sector Sector
		{
			get;
			private set;
		}

		public Emperor(Sector sector, Asteroid homeworld)
		{
			this.Colonies = new List<Colony>();
			//var colony = homeworld.BuildColony(this);	// denne skal bygge et HQ!
			//colony.Governor = new Governor2(colony, this);
			//Colonies.Add(homeworld.Colony);
			Colonize( homeworld );

			General = new InitialGeneral(this);
			Sector = sector;
		}

		public void Colonize( Asteroid asteroid )
		{
			asteroid.EmperorKnowledge[ this ] = EmperorInfo.Own;
			var colony = asteroid.BuildColony( this );	// denne skal bygge et HQ!
			colony.Governor = new Governor2( colony, this );
			Colonies.Add( asteroid.Colony );
		}

		public General General
		{
			get;
			internal set;
		}

		//public Emperor(List<Colony> colonies)
		//{
		//    this.Colonies = colonies;
		//}

		public List<Colony> Colonies { get; private set; }

		public void Update()	// behøver ikke køre så tit
		{
			foreach (Colony colony in Colonies)
			{
                if (colony.Level == ColonyLevel.Mature && colony.GetBuildingCount(BuildingType.Shipyard) == 0)	// og shipyard er ikke i køen!
                {
                    // byg shipyard
					Console.WriteLine("naval upgrade!");
					((Governor2)colony.Governor).BuildingQueue.Enqueue(BuildingType.Shipyard);
					((Governor2)colony.Governor).BuildingQueue.Enqueue(BuildingType.WeaponsFactory);
					//colony.Build(BuildingType.Shipyard, new Building.CompletedCallback(OnCompletedCallback) );// vi skal have et callback når denne bygning er færdig
					//((Governor2)colony.Governor).ShipQueue.Enqueue(new Scout());	// byg et skiw!
				}
				colony.Update();
                colony.Governor.Update();
			}
			General.Update();
			// vurder, klassificer kolonier (udvikles / klar)
			// skift governor for kolonier om nødvendigt. initial, civil, defensive, offensive
			// vurder trussels-niveau (er fjenden set=>oprust, lokaliseret=>angrib, krig)
			// giv ordrer til General AI
		}
        private void OnCompletedCallback(Building building, Colony colony)
        {
            if (building.Type == BuildingType.Shipyard)
            {
                //colony.Level = ColonyLevel.NavalBase;
                //colony.g
            }
        }
	}

    public enum EnemyState
    {
        NotKnown,
        ActivitySpotted,
        ColonySpotted,
        War
    }
    public enum MilitaryState
    {
        Explore,
        Colonize,
        Combat
    }

	//class General
	//{
        /*  Explore:
         * for hver koloni som har en home fleet
         * hvis der er et scoutship, så sendt det på mission
         * scoutship og andre har en event for om et fjentligt skib eller koloni bliver set, som den kan opdatwere generalen med
         * 
         * Colonize: 
         * hvis der findes en tom asteroide, så se på alle home fleets om vi har et colony ship. har vi, så send det på mission
         * hvis ikke der er et colony ship, så bed om at få det bygget (?)
         * 
         * Combat:
         * sørg for at der bliver bygget masser af skibe på alle navalbases (?)
         * når en homefleet er stor nok, send den mod fjenden. angrib gerne fra flere kolonier på een gang. 
         * alt efter personlighed, indled evt med missiler
         * 
         * activityspotted: vi skal til at lave nogle skibe til forsvar/angreb
         * colonyspotted: vi skal gøre klar til angreb mod kolonien
         * war: ?
         */
	//}
}
